perm filename FED.SAI[SAI,BGB] blob sn#103918 filedate 1974-05-30 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00007 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "FED" COMMENT FILM EDITOR - BRUCE G. BAUMGART - MAY 1974
C00005 00003	REQUIRE "ABBREV[SYS,BGB]" SOURCE_FILE
C00006 00004	SUBR DPYF(ITG I)				α DISPLAY I'TH FRAME
C00009 00005	SUBR OUTSNIP (STRING STR)		α OUTPUT A SNIP OF FRAMES
C00011 00006	SUBR DPYB	α DISPLAY A BAND OF IMAGES
C00013 00007	α MAIN EXECUTION
C00015 ENDMK
C⊗;
BEGIN "FED" COMMENT FILM EDITOR - BRUCE G. BAUMGART - MAY 1974;
COMMENT

FILM EDITOR DESIGN NOTES:

1. Data Rates.

	Moderately interesting frame requires about 1K words.
	24 Frames per second  *  60 seconds per minute
	=  1,440 frames   1 minute
	   2,880 frames   2 minutes
	   5,760 frames   4 minutes
	  11,520 frames   8 minutes
	  23,040 frames  16 minutes
	  46,080 frames  32 minutes
	  92,160 frames  64 minutes	  86,400 frames per hour

2. Memory capacities.

	CORE:		165K words.
	Disk System:	5 packs * 17 Megawords/pack  = 85 Megawords.
	UDP:		=7600 tracks * (=18 records of =128 word
			 		+ 1 record  of  =32 words)
			=7600 track * =2336 words per track = 17,753,600 words.
	Librascope:	32 bands of 76K of 1024 words = 2,432K = 2,490,368 words.
	Mag Tape:	K/foot * 2400 feet per reel  =  2.5 Megawords per tape.

3. Logical Structure.

	Film	   maximum 3 hours    1 to 10 Acts.
	Acts	   maximum 1 hour     1 to 10 Scenes.
	Scenes     1 to 20 minutes    1 to 10 takes.
	Takes	   1 minute	      1 to 100 snips
	Snips	   4 seconds	      1 to 100 frames
	Frames	   1/24 second

4. Command functions:

	Display a single III plot file.
	Run a Snip of Film.
	Single Step a film.
	Merge frames of films into a snip file.
	Unmerge a snip into a sequence of frames.
	Frame repetition.
;
REQUIRE "ABBREV[SYS,BGB]" SOURCE_FILE;

	DEFINE UPGIOT  ="'703000000000";
	DEFINE CALLI="'047000000000";
	DEFINE SPCWAR ="'043000000000";

	XSUBR CORGET;
	XSUBR CORREL;

BEGIN "INNER"
	SAFE ITG ARRAY DPYBUF [0:1];	α DISPLAY BUFFER HEADER;

	ITG ARRAY FRAME [0:200];
	ITG ARRAY SIZE  [-28:200];

	ITG I,J,FLG;
	ITG PTR,SIZ;
SUBR DPYF(ITG I);				α DISPLAY I'TH FRAME;
BEGIN "DPYF"
	PTR ← FRAME[I];
	SIZ ← SIZE[I];
	S⊂ UPGIOT PTR;JFCL;⊃;			α DISPLAY PIECE OF GLASS;
END "DPYF"; α BGB 28 MAY 1974 -------------------------------------------------;

	SAFE ITG ARRAY INFO[0:10];

SUBR IFRAME (STRING STR;ITG I);			α INPUT A SINGLE FRAME;
BEGIN "IFRAME"
	ITG TMP;
	SIZE[I] ← FRAME[I] ← 0;
	OPEN(1,"DSK",8,3,0,0,0,0);LOOKUP(1,STR,FLG);
	IF FLG THEN ⊂ RELEASE(1);RETURN;⊃;
	FILEINFO(INFO);TMP←INFO[3];S⊂ MOVS TMP;MOVNM TMP;⊃;
	OUTSTR("	FRAME "&CVS(I)&"	FILE SIZE "&CVS(TMP));

	WORDIN(1);SIZ ← WORDIN(1);OUTSTR("  "&CVS(SIZ));
	ARRYIN(1,DPYBUF[PTR],SIZ);RELEASE(1);
	FRAME[I]←LOCATION(DPYBUF[PTR]);		α LOCATION OF FRAME;
	SIZE[I]←SIZ;PTR←PTR+SIZ;		α SIZE OF FRAME;
	OUTSTR("	EOF"&↓);
END "IFRAME"; α BGB 28 MAY 1974 ----------------------------------------------;

SUBR INFRAMES(STRING STR);		α INPUT A SEQUENCE OF FRAMES;
BEGIN "INFRAMES"
	PTR ← 0;
	S⊂ SETZ 2,;MOVEI 3,65000;PUSHJ '17,CORGET;JFCL;MOVEM 2,DPYBUF;⊃;
	FOR I←0 THRU 150 DO IFRAME(STR&"."&CVS(I),I);
END "INFRAMES";
SUBR OUTSNIP (STRING STR);		α OUTPUT A SNIP OF FRAMES;
BEGIN "OUTSNIP"
	OPEN(1,"DSK",8,0,3,0,0,0);
	ENTER(1,STR,FLG);
	SIZE[-27] ← PTR;			α SIZE OF SNIP IN WORDS;
	ARRYOUT(1,SIZE[-28],128);
	ARRYOUT(1,DPYBUF[0],PTR);
	RELEASE(1);OUTSTR("	EOF."&↓);
END "OUTSNIP";
α ----------------------------------------------------------------------------;
SUBR INSNIP (STRING STR);		α INPUT A SNIP OF FRAMES;
BEGIN "INSNIP"
	ITG I;
	OPEN(1,"DSK",15,3,0,0,0,0);
	LOOKUP(1,STR,FLG);
	IF FLG THEN ⊂ RELEASE(1);RETURN;⊃;

	ARRYIN(1,SIZE[-28],128);
	PTR ← (SIZE[-27] LOR 1)+1;

	S⊂ SETZ 2,;MOVE 3,PTR;			α ALLOCATE MEMORY SPACE;
	PUSHJ '17,CORGET;JFCL;MOVEM 2,DPYBUF;⊃;

	ARRYIN(1,DPYBUF[0],PTR);
	RELEASE(1);OUTSTR("	EOF."&↓);

	PTR ← 0;FOR I← 0 THRU 99 DO IF SIZE[I]≠0 THEN ⊂
	FRAME[I]←LOCATION(DPYBUF[PTR]);PTR←PTR+SIZE[I];⊃ ELSE
	FRAME[I]←0;

END "INSNIP";
SUBR DPYB;	α DISPLAY A BAND OF IMAGES;
S⊂ "LOOP" 
	LABEL L0,L1,SA,L2,L3,EOL;

α FIRE UP SPACE WAR JOB;
L0:	SETOM I;
	MOVEI SA;			α START ADDRESS OF SPACE WAR MODULE;
	HRLI '400002;			α RUN ON PDP-10 EVERY 1/30 OF A SECOND;
	CALLI '400003;			α SWCGO;
	SETZ;CALLI '400021;MOVEM '10;	α SEGNUM TO AC10;
	CALLI '400017;			α DETSEG;

α WAIT FOR FURTHER COMMANDS;
L1:	'51000000001;			α INCHRW WAIT FOR SPACE;
	MOVE 2,1;ANDI 1,'177;		α STRIP OF META-CTRL BITS;
	CAIE 1,'40;JRST L1;
	SPCWAR '636367;			α STOP THE SPACE WAR MODULE;
	MOVSI 1,'64240;'51000000001 3,;	α OUTSTR(CRLF);
	CALLI '10,'400016;JRST 4,;	α ATTSEG FROM AC10;
	JRST EOL;

α SPACE WAR MODULE;
SA:	AOS 1,I;CAILE 1,160;SETZM I;	α TEST FOR END OF LOOP;
	MOVE 1,I; ADD 1,FRAME;		α PTR ← PTR[I];
	SKIPN 1,(1);JRST SA;MOVEM 1,PTR;
	MOVE 1,I;ADD 1,SIZE;ADDI 1,28;	α SIZ ← SIZE[I];
	MOVE(1);MOVEM SIZ;
	JRST 3,@L2;L2: L3;		α LEAVE USER IOT MODE;
L3: 	UPGIOT PTR;JFCL;		α DISPLAY PIECE OF GLASS;
	CALLI '400024;			α DISMIS SPACE WAR MODULE;
EOL:    JFCL;
END "LOOP";
α MAIN EXECUTION;

	BREAKSET(1," ","I");
	OUTSTR(↓);

WHILE TRUE DO
BEGIN "LISTEN"
	STRING CMLINE,CMD;
	ITG CHR;

	OUTSTR("*");
	CMLINE ← INCHWL;
	IF LENGTH(CMLINE)=0 THEN CONTINUE;

	CMD ← SCAN(CMLINE,1,CHR);

	IF EQU(CMD,"INPUT")	THEN INFRAMES(CMLINE) ELSE
	IF EQU(CMD,"IN")	THEN INSNIP(CMLINE) ELSE
	IF EQU(CMD,"OUT")	THEN OUTSNIP(CMLINE) ELSE
	IF EQU(CMD,"RUN")	THEN DPYB ELSE
	IF EQU(CMD,"FRAME")	THEN DPYF(INTSCAN(CMLINE,CHR)) ELSE
	IF EQU(CMD,"DPY")	THEN ⊂ IFRAME(CMLINE,1);DPYF(1) ⊃ ELSE
	IF EQU(CMD,"EXIT")	THEN Q⊂ CALLI '12 ⊃ ELSE
	OUTSTR(9&CMD&" ?"&↓);

END "LISTEN";

END "INNER"
END "FED";